package com.schooleducation.dao;

import java.util.List;

/**
 * dao层公用方法封装
 * 
 * @author weijing
 *
 * @param <T>
 *            泛型，指定实体类 type
 * @param <PK>
 *            泛型，指定实体类主键的数据类型，如 Integer,Long
 */
public interface GenericDao<T, PK> {

	/**
	 * 保存指定实体类
	 * 
	 * @param entity
	 *            实体类
	 */
	public void save(T entity);

	/**
	 * 删除指定实体
	 * 
	 * @param entity
	 *            实体类
	 */
	public void delete(T entity);

	/**
	 * 删除指定实体
	 * 
	 * @param entityClass
	 *            实体类名
	 * @param id
	 *            实体类ID
	 */
	public void deleteById(Class<T> entityClass, PK id);

	/**
	 * 更新或保存指定实体
	 * 
	 * @param entity
	 *            实体类
	 */
	public void saveOrUpdate(T entity);

	/**
	 * 更新实体
	 * 
	 * @param entity
	 *            实体类
	 */
	public void update(T entity);

	/**
	 * 更新实体 可用于添加，修改，删除操作
	 * 
	 * @param hql
	 *            更新的HQL语句
	 * @param entity
	 *            实体类
	 */
	public void updateOrSaveOrDelete(final String hql, T entity);

	/**
	 * 模糊查询指定条件对象集合 用法：可以实例化一个空的T对象，需要查询某个字段，就set该字段条件然后调用该方法方法
	 * 缺点：该方法只支持String类型的模糊查询
	 * 
	 * @param entity
	 *            实体类
	 * @return 返回集合
	 */
	public List<T> findByExample(T entity);

	/**
	 * 获得所有实体集合
	 * 
	 * @param entityClass
	 *            实体
	 * @return 集合
	 */
	public List<T> findAll(Class<T> entityClass);

	/**
	 * 按hql查询所有实体集合
	 * 
	 * @param hql
	 *            hql语句
	 * @param entity
	 *            实体类
	 * @param start
	 *            开始
	 * @param limit
	 *            数据条数
	 * @return 结果集
	 */
	public List<T> findAll(String hql, T entity, int start, int limit);
	
	/**
	 * 按hql查询所有实体集合
	 * @param hql
	 * 		 hql语句
	 * @param start
	 * 		开始
	 * @param limit
	 * 		数据条数
	 * @return 结果集
	 */
	public List<T> findAll(String hql, int start, int limit);

	/**
	 * 查询指定PK实体类对象
	 * 
	 * @param entityClass
	 *            实体类名
	 * @param id
	 *            实体PK
	 * @return 实体对象
	 */
	public T findById(Class<T> entityClass, PK id);

	/**
	 * 按HQL条件查询列表
	 * 
	 * @param hql
	 *            hql查询语句，支持链接查询或多条件查询
	 * @param entity
	 *            实体类
	 * @return 实体对象
	 */
	public T findByHql(String hql, T entity);

	/**
	 * 获得所有实体集合（带翻页）
	 * 
	 * @param entityClass
	 *            实体类名
	 * @param start
	 *            开始
	 * @param limit
	 *            数据条数
	 * @return
	 */
	public List<T> findByPage(Class<T> entityClass, int start, int limit);

	/**
	 * 获取所有数据条数
	 * 
	 * @param entityClass
	 *            实体类名
	 * @return 数据条数
	 */
	public Long getTotalCount(Class<T> entityClass);

	/**
	 * 按HQL查询数据条数
	 * 
	 * @param hql
	 *            hql语句
	 * @param entity
	 *            实体类
	 * @return
	 */
	public Long getTotalCount(String hql, T entity);
}
